/**
 * 
 */
package comunicaciones;

/**
 * @author hvc
 *
 */
import java.net.*;
import java.io.*;

public class ClienteBuzon {
	
	private String host;
	private String nombre_esclavo;
	private Socket socket;
	//private BuzonEsclavo buzon;
	
	public ClienteBuzon(String host, String nombre_esclavo, int puerto) {
		this.host = host;
		this.nombre_esclavo = nombre_esclavo;
		/* Se crea el socket cliente */
		try{
			System.out.println("host es: "+host);
			this.socket = new Socket(host, puerto);
		}catch(java.net.UnknownHostException e1){
			System.out.println("La direccion IP del host no ha podido ser determinada.");
			//socketS.close();
        	e1.printStackTrace();
			System.exit(1);
		}catch(IOException e2){
			System.out.println("Un error de E/S ha ocurrido cuando se creaba el socket.");
			//socketS.close();
        	e2.printStackTrace();
			System.exit(1);
		}catch(SecurityException e3){
			System.out.println("Existe un manejador de seguridad y su metodo \"checkConnect\" no permite la operacion.");
			//socketS.close();
        	e3.printStackTrace();
			System.exit(1);
		}
		System.out.println ("Conectado con el servidor.");
	}
	
	public void iniciarCliente(automatas.AutomataEsclavo automata)throws IOException{
		DataInputStream istream = null;
		DataOutputStream ostream = null;
		long puerto = -1;
		//String nombre = "esclavo1";
		Buzon buzon=null;
		try{			
			istream = new DataInputStream(socket.getInputStream());
			ostream = new DataOutputStream(socket.getOutputStream());
		}catch(IOException e){
			System.out.println("Un error de E/S ha ocurrido cuando se creaba el flujo de entrada, el socket esta " +
					"			cerrado, el socket no esta conectado, o la entrada del socket ha sido apagado usando \"shutdownInput()\".");
			socket.close();
        	e.printStackTrace();
			System.exit(1);
		}
		try{
			puerto = istream.readLong();
			System.out.println("ClienteBuzon-: puerto Buzon maestro:"+puerto);
			ostream.writeUTF(nombre_esclavo);
			ostream.flush();
		}catch(IOException e){
			System.out.println("ClienteBuzon-: Ha ocurrido un error de E/S, al leer un entero, o");
			System.out.println("ClienteBuzon-: Ha ocurrido un error de E/S, al escribir un string.");
			socket.close();
			ostream.close();
			istream.close();
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("ClienteBuzon-: puerto Buzon maestro leido:"+puerto);
		if(puerto > 0){
			//buzon = new BuzonEsclavo(host, (int)puerto/*,nombre*/);
			//buzon.start();
			//new BuzonEsclavo(automata, host,(int)puerto).start();
			buzon = new BuzonEsclavo(automata, host,(int)puerto);
			buzon.start();
			/*synchronized (buzon){
				while(!((BuzonEsclavo)buzon).isInicializado()){
					System.out.println("Esperamos a que se inicialice el buzon");
					try {
						wait();
						System.out.println("Hemos despertado");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
						
				}
			}*/
			System.out.println("ClienteBuzon-: puerto correcto.");
		}else
			System.out.println("ClienteBuzon-: puerto incorrecto.");
		/*
		try{
			Thread.sleep(10000);
			buzon.addMenssageEscritura(new Mensaje(new Integer(10)));
			buzon.join();
		}catch(InterruptedException e){
			System.out.println("Buzon-: Otro hilo ha interrumpido el hilo actual. El estado interrumpido del hilo actual es desbloquedado cuando se lanza esta excepcion.");
			//socketS.close();
			e.printStackTrace();
			System.exit(1);
		}
		*/
		try{
			//buzon.join();
			System.out.println("join en el clienteBuzon");
		}catch(Exception e){
			System.out.println("Error en el join.");
			//socket.close();
        	e.printStackTrace();
			System.exit(1);
		}
	}
	
	public void iniciarCliente(SCADA.SCADA scada)throws IOException{
		DataInputStream istream = null;
		DataOutputStream ostream = null;
		long puerto = -1;
		//String nombre = "esclavo1";
		Buzon buzon=null;
		try{			
			istream = new DataInputStream(socket.getInputStream());
			ostream = new DataOutputStream(socket.getOutputStream());
		}catch(IOException e){
			System.out.println("Un error de E/S ha ocurrido cuando se creaba el flujo de entrada, el socket esta " +
					"			cerrado, el socket no esta conectado, o la entrada del socket ha sido apagado usando \"shutdownInput()\".");
			socket.close();
        	e.printStackTrace();
			System.exit(1);
		}
		try{
			puerto = istream.readLong();
			System.out.println("ClienteBuzon-: puerto Buzon maestro:"+puerto);
			ostream.writeUTF(nombre_esclavo);
			ostream.flush();
		}catch(IOException e){
			System.out.println("ClienteBuzon-: Ha ocurrido un error de E/S, al leer un entero, o");
			System.out.println("ClienteBuzon-: Ha ocurrido un error de E/S, al escribir un string.");
			socket.close();
			ostream.close();
			istream.close();
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("ClienteBuzon-: puerto Buzon maestro leido:"+puerto);
		if(puerto > 0){
			//buzon = new BuzonEsclavo(host, (int)puerto/*,nombre*/);
			//buzon.start();
			//new BuzonEsclavo(automata, host,(int)puerto).start();
			buzon = new BuzonScada(scada, host,(int)puerto);
			buzon.start();
			/*synchronized (buzon){
				while(!((BuzonEsclavo)buzon).isInicializado()){
					System.out.println("Esperamos a que se inicialice el buzon");
					try {
						wait();
						System.out.println("Hemos despertado");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
						
				}
			}*/
			System.out.println("ClienteBuzon-: puerto correcto.");
		}else
			System.out.println("ClienteBuzon-: puerto incorrecto.");
		/*
		try{
			Thread.sleep(10000);
			buzon.addMenssageEscritura(new Mensaje(new Integer(10)));
			buzon.join();
		}catch(InterruptedException e){
			System.out.println("Buzon-: Otro hilo ha interrumpido el hilo actual. El estado interrumpido del hilo actual es desbloquedado cuando se lanza esta excepcion.");
			//socketS.close();
			e.printStackTrace();
			System.exit(1);
		}
		*/
		try{
			//buzon.join();
			System.out.println("join en el clienteBuzon");
		}catch(Exception e){
			System.out.println("Error en el join.");
			//socket.close();
        	e.printStackTrace();
			System.exit(1);
		}
	}
}
